home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / comm / misc / easytransfer.lzh / EasyTransfer / PCSource / EasyPC.c
Encoding:
C/C++ Source or Header  |  1995-11-11  |  29.0 KB  |  1,296 lines

  1.  
  2.  
  3. /*
  4.  
  5.    EasyTransfer. By Kamran Karimi.
  6.    Compiled with Borlald C++ 3.1:  "C:\> bcc -ms <file name>"
  7.  
  8.    Transfers files from a IBM PC or compatible to an Amiga and vice versa,
  9.    using a 3 wire serial link. This is the PC file. Another program
  10.    should run on the Amiga.
  11.  
  12. */
  13.  
  14. #ifdef __cplusplus
  15. #undef __cplusplus
  16. #endif
  17.  
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #include <ctype.h>
  22. #include <dos.h>
  23. #include <dir.h>
  24. #include <conio.h>
  25. #include <io.h>
  26. #include <fcntl.h>
  27. #include <bios.h>
  28. #include <sys/stat.h>
  29.  
  30. #ifndef min
  31. #define min(a,b) (a) <= (b) ? (a) : (b)
  32. #endif
  33.  
  34. #ifdef NTRANS
  35. struct FileTranslate
  36. {
  37.  char Aname[32];
  38.  char Dname[14];
  39.  struct FileTranslate *next,*prev;
  40. };
  41. struct FileTranslate FirstTranslate = { NULL,NULL,NULL,NULL };
  42. struct FileTranslate *TransMark,*PrevFT; /* prev added entry */
  43.  
  44. FILE *TFile = NULL; /* translation file */
  45. long Suffix; /* suffix for uniquing of names */
  46.  
  47. char *TransFile = "ETFile";
  48. char *CheckSign = "This Is How We Do It!";
  49. #endif
  50.  
  51. #define TRUE 1
  52. #define FALSE 0
  53.  
  54. #define OK   1
  55. #define FAIL 0
  56.  
  57. #define SERTESTLEN 255
  58.  
  59. #define NO_ERROR        0
  60. #define ERROR_NoSynch   6
  61. #define ERROR_Break     7
  62. #define ERROR_SRFExists 10
  63. #define ERROR_SendRFile 15
  64. #define ERROR_Timeout   13
  65. #define ERROR_RecFile   14
  66. #define ERROR_SetSer    17
  67. #define ERROR_NoSpeed   18
  68. #define ERROR_Direc     19
  69. #define ERROR_MKDIR     25
  70. #define ERROR_CHDIR     24
  71. #define ERROR_RMDIR     26
  72. #define ERROR_FDelete   27
  73. #define ERROR_NOMEM     32
  74. #define ERROR_CheckSum  45
  75.  
  76. #define ERROR    0
  77. #define QUIT    49
  78. #define DIR     50
  79. #define CD      51
  80. #define RECEIVE 52
  81. #define SEND    53
  82. #define MKDIR   54
  83. #define RMDIR   55
  84. #define DELETE  56
  85.  
  86. #define MAXBIOSSPEED  6
  87. #define MAXHARDSPEED 10
  88. unsigned int BiosSpeed[MAXBIOSSPEED] =
  89.                  { 0X40, 0X60, 0X80, 0XA0, 0XC0, 0XE0 };
  90. unsigned int HardSpeed[MAXHARDSPEED] =
  91.         { 0X180, 0XC0, 0X60, 0X30, 0X18, 0XC, 0X6, 0X3, 0X2, 0X1 };
  92. unsigned int ServerWait[MAXHARDSPEED] =
  93.   { 30, 60, 120, 240, 480, 960, 1920, 3480, 5760, 11520 };
  94.  
  95. long CurrSpeed;
  96. long Test = FALSE;
  97. long DelayTime = 3;
  98. long CheckSumTry = 0;
  99.  
  100. #define COM1 0
  101. #define COM2 1
  102.  
  103. #define BIOS 0
  104. #define HARD 1
  105.  
  106. int CurrPort = COM2;
  107. int PortAddr[] = { 0X3F8, 0X2F8 };
  108. int Method = -1;
  109. int verb = FALSE;
  110.  
  111. #define SERSET     0
  112. #define SERSEND    1
  113. #define SERRECEIVE 2
  114. #define SERSTATUS  3
  115.  
  116. #define TX  0
  117. #define RX  0
  118. #define IER 1
  119. #define IIR 2
  120. #define LCR 3
  121. #define MCR 4
  122. #define LSR 5
  123. #define MSR 6
  124.  
  125. #define DLLSB 0
  126. #define DLMSB 1
  127.  
  128. #define RCVRDY  0X01
  129. #define OVRERR  0X02
  130. #define PRTYERR 0X04
  131. #define FRMERR  0X08
  132. #define BRKINT  0X10
  133. #define XMTRDY  0X40
  134.  
  135. #define DTR 1
  136. #define RTS 2
  137.  
  138. #define TIMER 0X1C
  139.  
  140. #define ABORT 0
  141.  
  142. #define PACKET_SIZE 255
  143. unsigned char Buffer[PACKET_SIZE],Temp[2 * PACKET_SIZE];
  144. unsigned char CMDLen;
  145.  
  146. volatile long TimerCounter;
  147. void interrupt (*OldHandler)(void);
  148.  
  149. struct text_info ti;   
  150.  
  151. union
  152. {
  153.  unsigned long Len;
  154.  char Char[4];
  155. } FileLen;
  156.  
  157. size_t FileBuffSize = 32000;
  158.  
  159. #ifdef NTRANS
  160. long IsIllegal(char *Aname,char *Dname)
  161. {
  162.  char *dot,*dot2,dosname[14],Atemp[32],StrSuff[10];
  163.  long dlen,SuffLen;
  164.  
  165.  ltoa(Suffix,StrSuff,10);
  166.  SuffLen = 8 - strlen(StrSuff);
  167.  strcpy(Atemp,Aname);
  168.  SuffLen++;
  169.  dot = strchr(Atemp,'.');
  170.  dot2 = dot;
  171.  while(dot)
  172.  {
  173.   dot2 = strchr(dot + 1,'.');
  174.   if(!dot2) break;
  175.   *dot = '_';
  176.   dot = dot2;
  177.  }
  178.  /* dot has the last possible extension */
  179.  strncpy(dosname,Atemp,8);
  180.  if(strlen(Atemp) >= 8) dosname[8] = NULL;
  181.  dlen = strlen(dosname);
  182.  if(dot)
  183.  {
  184.   strncat(dosname,dot,4);
  185.   if(strlen(dot) >= 4)  dosname[dlen + 4] = NULL;
  186.  }
  187.  if(strcmp(Aname,dosname))
  188.  {
  189.   strncpy(dosname,Atemp,SuffLen);
  190.   if(strlen(Atemp) >= SuffLen) dosname[SuffLen] = NULL;
  191.   dlen = strlen(dosname);
  192.   strcat(dosname,StrSuff);
  193.   if(dot)
  194.   {
  195.    strncat(dosname,dot,4);
  196.    if(strlen(dot) >= 4) dosname[dlen + 4] = NULL;
  197.   }
  198.   strcpy(Dname,dosname);
  199.   return TRUE;
  200.  }
  201.  else strcpy(Dname,Aname);
  202.  return FALSE;
  203. }
  204.  
  205. long AddName(char *Aname, char *Dname)
  206. {
  207.  struct FileTranslate *ft;
  208.  
  209.  if(!(ft = (struct FileTranslate *) 
  210.  malloc(sizeof(struct FileTranslate))))
  211.   return FAIL;
  212.  ft->next = NULL;
  213.  strcpy(ft->Aname,Aname);
  214.  strcpy(ft->Dname,Dname);
  215.  PrevFT->next = ft;
  216.  ft->prev = PrevFT;
  217.  PrevFT = ft;
  218.  return OK;
  219. }
  220.  
  221. char *GetAmigaName(char *Dname)
  222. {
  223.  struct FileTranslate *ft;
  224.  
  225.  ft = FirstTranslate.next;
  226.  while(ft)
  227.  {
  228.   if(!stricmp(ft->Dname,Dname))
  229.    { printf(" GetAmi  going with '%s'\n",ft->Aname); return ft->Aname; }
  230.   ft = ft->next;
  231.  }
  232.  return Dname;
  233. }
  234.  
  235. char *GetDosName(char *Aname)
  236. {
  237.  struct FileTranslate *ft;
  238.  
  239.  printf("getdosname with: '%s'\n",Aname);
  240.  ft = FirstTranslate.next;
  241.  while(ft)
  242.  {
  243.   if(!stricmp(ft->Aname,Aname)) return ft->Dname;
  244.   ft = ft->next;
  245.  }
  246.  return Aname;
  247. }
  248.  
  249. void OpenTranslateFile(void)
  250. {
  251.  char StrSuffix[10],Sign[80];
  252.  char Aname[32];
  253.  char Dname[14];
  254.  
  255.  PrevFT = &FirstTranslate;
  256.  FirstTranslate.prev = NULL;
  257.  FirstTranslate.next = NULL;
  258.  TFile = fopen(TransFile,"r");
  259.  if(!TFile) return;
  260.  printf("trans file opened\n");
  261.  if(!fgets(Sign,strlen(CheckSign) + 2,TFile)) { fclose(TFile); return; }
  262.  Sign[strlen(Sign) - 1] = NULL;
  263.  printf("checksum don!\n");
  264.  
  265.  if(stricmp(Sign,CheckSign)) { fclose(TFile); return; }
  266.   printf("checksum matched! '%s'\n",Sign);
  267.  if(!fgets(StrSuffix,10,TFile)) { fclose(TFile); return; }
  268.  StrSuffix[strlen(StrSuffix) - 1] = NULL;
  269.  Suffix = atol(StrSuffix);
  270.  printf("suffix = %d   '%s'\n",Suffix,StrSuffix);
  271.  if(Suffix <= 0) { fclose(TFile); return; }
  272.  while(!feof(TFile))
  273.  {
  274.   if(!fgets(Dname,14,TFile)) break;
  275.   Dname[strlen(Dname) - 1] = NULL;
  276.   if(!fgets(Aname,34,TFile)) break;
  277.   Aname[strlen(Aname) - 1] = NULL;
  278.   printf("aname = '%s'  dname = '%s'\n",Aname,Dname);
  279.   if(!AddName(Aname,Dname)) { fclose(TFile); return; }
  280.  }
  281.  TransMark = PrevFT->next; /* new entries added here */
  282.  fclose(TFile);
  283.  printf("trans don!\n");
  284.  TFile = NULL;
  285. }
  286.  
  287.  
  288. void PrepareTrans(void)
  289. {
  290.  struct FileTranslate *ftemp,*ftemp2;
  291.  
  292.  printf("prep !\n");
  293.  ftemp = FirstTranslate.next;
  294.  while(ftemp)
  295.  {
  296.   ftemp2 = ftemp->next;
  297.   free(ftemp);
  298.   ftemp = ftemp2;
  299.  }
  300.  if(TFile) fclose(TFile);
  301.  OpenTranslateFile();
  302. }
  303. #endif /* NTRANS */
  304.  
  305. int Handler(int errval,int ax,int bp,int si)
  306. {
  307.  if((errval > ax) && (bp > si)) ;
  308.  hardretn(2);
  309.  return 2;
  310. }
  311.  
  312.  
  313. void FillScreen(void)
  314. {
  315.  int count;
  316.  
  317.  clrscr();
  318.  for(count = 1; count <= 25; count++)
  319.  {
  320.   gotoxy(1,count);
  321.   printf(
  322. "IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM");
  323.  }
  324. }
  325.  
  326. void Wheel(void)
  327. {
  328.  static int prevx = 1,prevy = 1,dir,pos = 0;
  329.  static char Amiga[8] = "AMIGA! ";
  330.  int color = 0,x,y;
  331.  
  332.  gotoxy(prevx,prevy); putch(Amiga[(prevx - 1) % 7]);
  333.  x = prevx;
  334.  y = prevy;
  335.  dir = (rand() + dir) % 80;
  336.  color = (rand() + color) % 8;
  337.  textcolor(color);
  338.  switch(dir)
  339.  {
  340.   case 0:
  341.   case 1: x++;
  342.       break;
  343.   case 3:
  344.   case 4: x--;
  345.       break;
  346.   case 6:
  347.   case 7: y++;
  348.       break;
  349.   case 9:
  350.   case 10: y--;
  351.        break;
  352.   case 12:
  353.   case 13: x++;y++;
  354.        break;
  355.   case 15:
  356.   case 16: x++;y--;
  357.        break;
  358.   case 18:
  359.   case 19: x--;y++;
  360.        break;
  361.   case 21:
  362.   case 22: x--;y--;
  363.        break;
  364.   case 23: x = x + 7; y = y + 3; break;
  365.   case 24: x = x - 7; y = y - 3; break;
  366.   case 25: x = x + 7; y = y - 3; break;
  367.   case 26: x = x - 7; y = y + 3; break;
  368.   default:break;
  369.  }
  370.  
  371.  if(x > 79) x = 1;
  372.  if(y > 25) y = 1;
  373.  if(x <= 0) x = 79;
  374.  if(y <= 0) y = 25;
  375.  
  376.  prevx = x;
  377.  prevy = y;
  378.  gotoxy(prevx,prevy);
  379.  
  380.  pos = (++pos % 4);
  381.  switch(pos)
  382.  {
  383.  case 0: printf("-");
  384.     break;
  385.  case 1: printf("\\");
  386.     break;
  387.  case 2: printf("|");
  388.     break;
  389.  case 3: printf("/");
  390.     break;
  391.  }
  392.  delay(45);
  393. }
  394.  
  395. void interrupt Timer()
  396. {
  397.  TimerCounter++;
  398.  OldHandler();
  399. }
  400.  
  401. void OpenTimer(void)
  402. {
  403.  OldHandler = getvect(TIMER);
  404.  setvect(TIMER,Timer);
  405. }
  406.  
  407. void CloseTimer(void)
  408. {
  409.  setvect(TIMER,OldHandler);
  410. }
  411.  
  412. int c_break(void)
  413. {
  414.  textmode(ti.currmode);
  415.  textattr(ti.attribute);
  416.  CloseTimer();
  417.  _setcursortype(_NORMALCURSOR);
  418.  clrscr();  
  419.  printf("\nEasyTransfer: User Break Encountered... Quitting\n");     
  420.  return ABORT;
  421. }
  422.  
  423. void ClrSer(void)
  424. {
  425.  if(Method == BIOS)
  426.  {
  427.   while(!(bioscom(SERSTATUS,0,CurrPort) & (XMTRDY << 8)));
  428.   if(bioscom(SERSTATUS,0,CurrPort) & (RCVRDY << 8))
  429.    bioscom(SERRECEIVE,0,CurrPort);
  430.  }
  431.  else
  432.  {
  433.   while(!(inportb(PortAddr[CurrPort] + LSR) & XMTRDY));
  434.   if(inportb(PortAddr[CurrPort] + LSR) & RCVRDY)
  435.    inportb(PortAddr[CurrPort] + RX);
  436.  }
  437. }
  438.  
  439. void SetSer(int Speed)
  440. {
  441.  char Setting = 0X03;    /* xxx 00 0 11 */
  442.  if(Method == BIOS)
  443.  {
  444.   Setting |= BiosSpeed[Speed];
  445.   bioscom(SERSET,Setting,CurrPort);
  446.  }
  447.  else
  448.  {
  449.   outportb(PortAddr[CurrPort] + IER, 0);
  450.   outportb(PortAddr[CurrPort] + LCR, 0x80);
  451.   outportb(PortAddr[CurrPort] + DLLSB, HardSpeed[Speed] & 0XFF);
  452.   outportb(PortAddr[CurrPort] + DLMSB, HardSpeed[Speed] >> 8);
  453.   outportb(PortAddr[CurrPort] + LCR, Setting);
  454.  }
  455.  ClrSer();
  456. }
  457.  
  458. void ActualSendPacket(unsigned char *ToSend, int CharCount)
  459. {
  460.  int count;
  461.  
  462.  for(count = 0; count < CharCount; count++)
  463.  {
  464.   if(Method == BIOS)
  465.   {
  466.    bioscom(SERSEND,ToSend[count],CurrPort);
  467.    while(!(bioscom(SERSTATUS,0,CurrPort) & (XMTRDY << 8)));
  468.   }
  469.   else
  470.   {
  471.    outportb(PortAddr[CurrPort] + TX,ToSend[count]);
  472.    while(!(inportb(PortAddr[CurrPort] + LSR) & XMTRDY));
  473.   }
  474.  }
  475. }
  476.  
  477. int RecNotReady(void)
  478. {
  479.  if(Method == HARD)
  480.   return !(inportb(PortAddr[CurrPort] + LSR) & RCVRDY);
  481.  else
  482.   return !(bioscom(SERSTATUS,0,CurrPort) & (RCVRDY << 8));
  483. }
  484.  
  485. long ActualReceivePacket(unsigned char *chr,unsigned int RecCount)
  486. {
  487.  long count;
  488.  long threshold = DelayTime * 18.2 + RecCount * 18.2 / ServerWait[CurrSpeed];
  489.  
  490.  TimerCounter = 0;
  491.  for(count = 0; count < RecCount; count++)
  492.  {
  493.   while(RecNotReady())
  494.   {
  495.    if(TimerCounter > threshold)
  496.    {
  497.     if(Test)
  498.     {
  499.      if(verb) printf("ReceivePacket(): Waiting For Workstation\n");
  500.      TimerCounter = 0;
  501.     }
  502.     else
  503.     {
  504.      if(verb) printf("ReceivePacket(): Workstation Not Responding\n");
  505.      return ERROR_Timeout;
  506.     }
  507.    }
  508.   }
  509.   if(Method == BIOS)
  510.    chr[count] = bioscom(SERRECEIVE,0,CurrPort);
  511.   else
  512.    chr[count] = inportb(PortAddr[CurrPort] + RX);
  513.  }
  514.  return NO_ERROR;
  515. }
  516.  
  517. void SendPacket(unsigned char *ToSend, unsigned int CharCount)
  518. {
  519.  unsigned char LocalBuff[PACKET_SIZE + 2];
  520.  short count;
  521.  short NumTry = 1;
  522.  unsigned char temp;
  523.  union Check
  524.  {
  525.   unsigned short CheckWord;
  526.   unsigned char CheckByte[2];
  527.  } CheckSum;
  528.  
  529.  if(CharCount > 1)
  530.  {
  531.   for(count = 0; count < CharCount; count++)
  532.    LocalBuff[count] = ToSend[count];
  533.   if(NumTry <= CheckSumTry) NumTry = CheckSumTry + 1;
  534.   CheckSum.CheckWord = 0;
  535.   for(count = 0; count < CharCount; count++)
  536.    CheckSum.CheckWord += (unsigned short) ToSend[count];
  537.   LocalBuff[CharCount] = CheckSum.CheckByte[1];
  538.   LocalBuff[CharCount + 1] = CheckSum.CheckByte[0];
  539.   while(NumTry > 0)
  540.   {
  541.    ActualSendPacket(LocalBuff,CharCount + 2);
  542.    ActualReceivePacket(&temp,1);
  543.    if(temp == 'Y')
  544.    {
  545.     ActualSendPacket(&temp,1);
  546.     return;
  547.    }
  548.    else NumTry--;
  549.   }
  550.  }
  551.  else ActualSendPacket(ToSend,CharCount);
  552. }
  553.  
  554. long ReceivePacket(unsigned char *chr, unsigned int RecCount)
  555. {
  556.  unsigned char LocalBuff[PACKET_SIZE + 2];
  557.  short count;
  558.  long Error;
  559.  short NumTry = 1;
  560.  unsigned char temp;
  561.  union Check
  562.  {
  563.   unsigned short CheckWord;
  564.   unsigned char CheckByte[2];
  565.  } CheckSum;
  566.  
  567.  if(RecCount > 1)
  568.  {
  569.   if(NumTry <= CheckSumTry) NumTry = CheckSumTry + 1;
  570.   while(NumTry > 0)
  571.   {
  572.    Error = ActualReceivePacket(LocalBuff,RecCount + 2);
  573.    if(Error) return Error;
  574.    CheckSum.CheckWord = 0;
  575.    for(count = 0; count < RecCount; count++)
  576.    {
  577.     CheckSum.CheckWord += (unsigned short) LocalBuff[count];
  578.     chr[count] = LocalBuff[count];
  579.    }
  580.    if( (LocalBuff[RecCount] != CheckSum.CheckByte[1]) ||
  581.        (LocalBuff[RecCount + 1] != CheckSum.CheckByte[0]) )
  582.    {
  583.     NumTry--;
  584.     temp = 'N';
  585.     ActualSendPacket(&temp,1);
  586.    }
  587.    else
  588.    {
  589.     temp = 'Y';
  590.     ActualSendPacket(&temp,1);
  591.     return ActualReceivePacket(&temp,1);
  592.    }
  593.   }
  594.   return ERROR_CheckSum;
  595.  }
  596.  else return ActualReceivePacket(chr,RecCount);
  597. }
  598.  
  599. void EstablishConnection(void)
  600. {
  601.  char chr;
  602.  int Synched = FALSE;
  603.  
  604.  while(!Synched)
  605.  {
  606.   while(RecNotReady())
  607.   {
  608.    if(!verb) Wheel();
  609.    else kbhit();
  610.   }
  611.   if(Method == BIOS)
  612.    chr = bioscom(SERRECEIVE,0,CurrPort);
  613.   else
  614.    chr = inportb(PortAddr[CurrPort] + RX);
  615.   if(chr == 'L')
  616.   {
  617.    SendPacket("!",1);
  618.    if(verb) printf("EstablishConnection(): Link Availability Checked\n");
  619.   }
  620.   else if(chr != '?')
  621.   { if(verb) printf("EstablishConnection(): Synchronization Lost\n"); }
  622.   else Synched = TRUE;
  623.  }
  624. }                               
  625.  
  626. char ReceiveCommand(void)
  627. {
  628.  long Error;
  629.  
  630.  SendPacket("!",1);
  631.  Error = ReceivePacket(&CMDLen,1);
  632.  if(Error) return Error;
  633.  SendPacket("!",1);
  634.  Error = ReceivePacket(Buffer,CMDLen);
  635.  if(Error) return ERROR;
  636.  return Buffer[0];
  637. }
  638.  
  639. long GetSynch(void)
  640. {
  641.  long Error;
  642.  unsigned char Buff;
  643.  
  644.  Error = ReceivePacket(&Buff,1);
  645.  if(Error) return Error;
  646.  if(Buff != '?') return ERROR_NoSynch;
  647.  else return NO_ERROR;
  648. }
  649.  
  650. long SendFileToAmiga(char *Name);
  651.  
  652. long SendDirToAmiga(char *Name)
  653. {
  654.  long Error;
  655.  int done;
  656.  int Attrib = FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_DIREC|FA_ARCH;
  657.  struct ffblk ffblk;
  658.  unsigned char temp;
  659.  
  660.  if(verb) printf("SendDirToAmiga(): Dir Name = '%s'\n",Name);
  661.  if(chdir(Name))
  662.  {
  663.   if(verb) printf("SendDirToAmiga(): Chdir Failed\n");
  664.   temp = 150 + ERROR_CHDIR;
  665.   SendPacket(&temp,1);
  666.   return ERROR_Direc;
  667.  }
  668. #ifdef NTRANS
  669.  PrepareTrans();
  670. #endif
  671.  SendPacket("D",1);
  672.  Error = GetSynch();
  673.  if(Error) { chdir(".."); return Error; }
  674.  Buffer[0] = strlen(Name);
  675.  SendPacket(Buffer,1);
  676.  Error = GetSynch();
  677.  if(Error) { chdir(".."); return Error; }
  678.  SendPacket(Name,strlen(Name));
  679.  Error = GetSynch();
  680.  if(Error) { chdir(".."); return Error; }
  681.  done = findfirst("*.*",&ffblk,Attrib);
  682.  while(!done)
  683.  {
  684.   if(verb) printf("SendDirToAmiga(): Dir Entry = '%s'\n",ffblk.ff_name);
  685.   if(strcmp(ffblk.ff_name,".") && strcmp(ffblk.ff_name,".."))
  686.   {
  687.    Error = SendFileToAmiga(ffblk.ff_name);
  688.    if(Error) { chdir(".."); return Error; }
  689.   }
  690.   done = findnext(&ffblk);
  691.  }
  692.  SendPacket("E",1);
  693.  Error = GetSynch();
  694.  if(Error) { chdir(".."); return Error; } 
  695.  chdir("..");
  696.  if(verb) printf("SendDirToAmiga(): Sent Dir Successfully\n");
  697.  SendPacket("!",1);
  698.  return NO_ERROR;
  699. }
  700.  
  701.  
  702. long SendFileToAmiga(char *Name)
  703. {
  704.   unsigned char temp;
  705.  int Attrib = FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_DIREC|FA_ARCH;
  706.  struct ffblk ffblk;
  707.  unsigned char SizeToSend;
  708.  char Buff,SizeBuffer[4];
  709.  FILE *File;
  710.  int count;
  711.  long Error,FileLength;
  712.  char *PCName;
  713.  
  714.  if(!findfirst(Name,&ffblk,Attrib))
  715.  {
  716.   SendPacket("!",1);
  717.   Error = GetSynch();
  718.   if(Error) return Error;
  719.  }
  720.  else
  721.  {
  722.   temp = 150 + ERROR_RecFile;
  723.   SendPacket(&temp,1);
  724.   return ERROR_RecFile;
  725.  }
  726.  if(ffblk.ff_attrib & FA_DIREC) return SendDirToAmiga(Name);
  727.  else
  728.  {
  729.   if(verb) printf("SendFileToAmiga(): Sendig File: '%s'\n",Name);
  730.   SendPacket("F",1);
  731.   Error = GetSynch();
  732.   if(Error) return Error;
  733. #ifdef NTRANS
  734.   PCName = GetDosName(Name);
  735. #else
  736.   PCName = Name;
  737. #endif
  738.   File = fopen(PCName,"rb");
  739.  
  740.   if(File == NULL)
  741.   {
  742.    if(verb) printf("SendFileToAmiga(): Can Not Open File To Send: '%s'\n",Name);
  743.    temp = 150 + ERROR_RecFile;
  744.    SendPacket(&temp,1);
  745.    return ERROR_RecFile;
  746.   }
  747.   setvbuf(File, NULL, _IOFBF, FileBuffSize);
  748.   FileLength = filelength(fileno(File));
  749.   FileLen.Len = FileLength;
  750.   for(count = 3; count >= 0; count--)
  751.    SizeBuffer[3 - count] = FileLen.Char[count];
  752.   SendPacket(SizeBuffer,4);
  753.   if(verb) printf("SendFileToAmiga(): File Length =  %ld\n",FileLen.Len);
  754.   Error = GetSynch();
  755.   if(Error) { fclose(File); return Error; }
  756.   Buff = strlen(Name);
  757.   SendPacket(&Buff,1);
  758.   Error = GetSynch();
  759.   if(Error) { fclose(File); return Error; }
  760.   SendPacket(Name,strlen(Name));
  761.   Error = GetSynch();
  762.   if(Error) { fclose(File); return Error; }
  763.   SendPacket("!",1);
  764.   while(FileLength > 0)
  765.   {
  766.    Error = ReceivePacket(&SizeToSend,1);
  767.    if(Error) { fclose(File); return Error; }
  768.    if(fread(Temp,1,SizeToSend,File) != SizeToSend)
  769.    {
  770.     if(verb) printf("SendFileToAmiga(): Read Failed!\n");
  771.     fclose(File);
  772.     return ERROR_SendRFile;
  773.    }
  774.    SendPacket(Temp,SizeToSend);
  775.    FileLength -= SizeToSend;
  776.   }
  777.   fclose(File);
  778.  }
  779.  if(verb) printf("SendFileToAmiga(): Sent File Successfully\n");
  780.  return NO_ERROR;
  781. }
  782.  
  783. long SendToAmiga(void)
  784. {
  785.  Buffer[CMDLen] = NULL;
  786.  if(verb) printf("SendToAmiga(): Name = '%s'\n",&Buffer[1]);
  787.  return SendFileToAmiga(&Buffer[1]);
  788. }
  789.  
  790. long HandleM_R_Dir(long CMD)
  791. {
  792.  unsigned char temp;
  793.  
  794.  Buffer[CMDLen] = NULL;
  795.  if(CMD == MKDIR)
  796.  {
  797.   if(!mkdir(&Buffer[1])) SendPacket("!",1);
  798.   else { temp = 150 + ERROR_MKDIR; SendPacket(&temp,1); return ERROR_MKDIR; }
  799.  }
  800.  else if(CMD == RMDIR)
  801.  {
  802.   if(!rmdir(&Buffer[1])) SendPacket("!",1);
  803.   else { temp = 150 + ERROR_RMDIR; SendPacket(&temp,1); return ERROR_RMDIR; }
  804.  }
  805.  return NO_ERROR;
  806. }
  807.  
  808. long ReceiveFileFromAmiga(void);
  809.  
  810. long ReceiveDirFromAmiga(void)
  811. {
  812.  unsigned char temp;
  813.  long Error;
  814.  unsigned char len,Type;
  815.  
  816.  SendPacket("!",1);
  817.  Error = ReceivePacket(&len,1);
  818.  if(Error) return Error;
  819.  SendPacket("!",1);
  820.  Error = ReceivePacket(Buffer,len);
  821.  if(Error) return Error;
  822.  Buffer[len] = NULL;
  823.  if(verb) printf("ReceiveDirFromAmiga(): Receiving Dir: '%s'\n",Buffer);
  824.  if(mkdir(Buffer))
  825.   { temp = 150 + ERROR_MKDIR; SendPacket(&temp,1); return ERROR_MKDIR; }
  826.  if(chdir(Buffer))
  827.   {temp = 150 + ERROR_CHDIR; SendPacket(&temp,1); return ERROR_CHDIR; }
  828. #ifdef NTRANS
  829.  PrepareTrans();
  830. #endif
  831.  if(verb) printf("ReceiveDirFromAmiga(): Mkdir And Chdir Successful\n");
  832.  SendPacket("!",1);
  833.  do
  834.  {
  835.   Error = ReceivePacket(&Type,1);
  836.   if(Error) { chdir(".."); return Error; }
  837.   if(Type == 'E') break;
  838.   if(Type != '?') { chdir(".."); return ERROR_Direc; }
  839.   Error = ReceiveFileFromAmiga();
  840.   if(Error) { chdir(".."); return Error; }
  841.  }while(1);
  842.  SendPacket("!",1);
  843.  chdir("..");
  844.  if(verb) printf("ReceiveDirFromAmiga(): Directory Received Successfully\n");
  845.  return NO_ERROR;
  846. }
  847.  
  848.  
  849. long ReceiveFileFromAmiga(void)
  850. {
  851.  long Error;
  852.  FILE *file;
  853.  int count,index;
  854.  unsigned char len,Mode,Protect;
  855.  char TBuff[2 * PACKET_SIZE];
  856.  unsigned char temp;
  857.  char *PCName;
  858. #ifdef NTRANS
  859.  char TempDName[34];
  860. #endif
  861.  
  862.  SendPacket("!",1);
  863.  Error = ReceivePacket(&Mode,1);
  864.  if(Error) return Error;
  865.  if(Mode == 'D') return ReceiveDirFromAmiga();
  866.  else
  867.  {
  868.   SendPacket("!",1);
  869.   Error = ReceivePacket(&Protect,1);
  870.   if(Error) return Error;
  871.   SendPacket("!",1);  
  872.   Error = ReceivePacket(&len,1);
  873.   if(Error) return Error;
  874.   SendPacket("!",1);
  875.   Error = ReceivePacket(Buffer,len);
  876.   if(Error) return Error;
  877.   Buffer[len] = NULL;
  878.   if(verb) printf("ReceiveFileFromAmiga(): Receiving File '%s'\n",Buffer);
  879. #ifdef NTRANS
  880.   PCName = GetDosName(Buffer);
  881.   IsIllegal(Buffer,TempDName);
  882.   printf("Name changed to: '%s'\n",TempDName);
  883. #else
  884.   PCName = Buffer;
  885. #endif
  886.   if(Protect == 'P')
  887.   {
  888.    file = fopen(PCName,"r");
  889.    if(file)
  890.    {
  891.     if(verb) printf("ReceiveFileFromAmiga(): Receiving File Already Exits\n");
  892.     temp = 150 + ERROR_SRFExists;
  893.     SendPacket(&temp,1);
  894.     fclose(file);
  895.     return ERROR_RecFile;
  896.    }
  897.   }  
  898.   file = fopen(PCName,"wb");
  899.   if(file == NULL)
  900.   {
  901.    if(verb) printf("ReceiveFileFromAmiga(): Can Not Create Receiving File\n");
  902.    temp = 150 + ERROR_SendRFile;
  903.    SendPacket(&temp,1);
  904.    return ERROR_RecFile;
  905.   }
  906.   setvbuf(file, NULL, _IOFBF, FileBuffSize);
  907.   SendPacket("!",1);
  908.   Error = ReceivePacket(&FileLen.Char[0],4);
  909.   if(Error) { fclose(file); return Error; }
  910.   if(verb) printf("ReceiveFileFromAmiga(): File Length = %ld\n",FileLen.Len);
  911.   while(FileLen.Len > 0)
  912.   {
  913.    len = min(FileLen.Len,PACKET_SIZE);
  914.    FileLen.Len -= len;
  915.    SendPacket(&len,1);
  916.    Error = ReceivePacket(Temp,len);
  917.    if(Error) { fclose(file); return Error; }
  918.    index = 0;
  919.    for(count = 0; count< len; count++)
  920.    {
  921.     if((Mode == 'T') && (Temp[count] == 10)) 
  922.      { TBuff[index++] = 10; TBuff[index++] = 13; }
  923.     else TBuff[index++] = Temp[count];
  924.    }
  925.    if(fwrite(TBuff,1,index,file) != index)
  926.    {
  927.     if(verb) printf("ReceiveFileFromAmiga(): Write Failed!\n");
  928.     fclose(file);
  929.     return ERROR_RecFile;
  930.    }
  931.   }
  932.   fclose(file);
  933.  }
  934.  SendPacket("!",1); 
  935.  if(verb) printf("ReceiveFileFromAmiga(): Received File Successfully\n");
  936.  return NO_ERROR;
  937. }
  938.  
  939. long HandleQuit(void)
  940. {
  941.  return NO_ERROR;
  942. }
  943.  
  944. long DeleteServerFile(void)
  945. {
  946.  unsigned char temp;
  947.  
  948.  Buffer[CMDLen] = NULL;
  949.  if(!unlink(&Buffer[1])) { SendPacket("!",1); return NO_ERROR; }
  950.  else 
  951.  { temp = 150 + ERROR_FDelete; SendPacket(&temp,1); return ERROR_FDelete; }
  952. }
  953.  
  954. long ChangeServerDir(void)
  955. {
  956.  int pos;
  957.  unsigned char temp, result = 150 + ERROR_CHDIR; /* assume failer */
  958.  char buffer[PACKET_SIZE];
  959.  long Error;
  960.  
  961.  Buffer[CMDLen] = NULL;
  962.  pos = 1;
  963.  if(Buffer[2] == ':')
  964.  {
  965.   setdisk(toupper(Buffer[1]) - 'A');
  966.   if(Buffer[3] == NULL) strcat(Buffer,"\\");
  967.  }
  968.  if( (Buffer[strlen(Buffer) - 1] == '\\') &&
  969.      (Buffer[strlen(Buffer) - 2] != ':'))
  970.  Buffer[strlen(Buffer) - 1] = NULL;
  971.  if(!chdir(&Buffer[pos]))
  972.   result = '!';
  973. #ifdef NTRANS
  974.  PrepareTrans();
  975. #endif
  976.  SendPacket(&result,1);
  977.  Error = GetSynch();
  978.  if(Error) return Error;
  979.  getcwd(buffer, PACKET_SIZE);
  980.  temp = strlen(buffer);
  981.  SendPacket(&temp,1);
  982.  Error = GetSynch();
  983.  if(Error) return Error;
  984.  SendPacket(buffer,temp);
  985.  Error = GetSynch();
  986.  if(Error) return Error;
  987.  SendPacket("!",1);
  988.  if(result != '!') return ERROR_CHDIR;
  989.  else return NO_ERROR;
  990. }
  991.  
  992. long SendDirEntriesToAmiga(void)
  993. {
  994.  long Error;
  995.  struct ffblk ffblk;
  996.  int Attrib = FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_DIREC|FA_ARCH;
  997.  unsigned int done;
  998.  unsigned char len;
  999.  unsigned int day,month,year,sec,minute,hour;
  1000.  char *AmName;
  1001.  
  1002.  done = findfirst("*.*",&ffblk,Attrib);
  1003.  while (!done)
  1004.  {
  1005.   if( !(ffblk.ff_attrib & FA_DIREC) ||
  1006.       (strcmp(".",ffblk.ff_name) && strcmp("..",ffblk.ff_name)) )
  1007.   {
  1008.    sec = (ffblk.ff_ftime & 0X001F) * 2;
  1009.    minute = (ffblk.ff_ftime & 0X07E0) >> 5;
  1010.    hour = (ffblk.ff_ftime & 0XF800) >> 11;
  1011.  
  1012.    day = ffblk.ff_fdate & 0X001F;
  1013.    month = (ffblk.ff_fdate & 0X01E0) >> 5;
  1014.    year = ((ffblk.ff_fdate & 0XFE00) >> 9) + 1980;
  1015.    if(!(ffblk.ff_attrib & FA_DIREC))
  1016.    {
  1017. #ifdef NTRANS
  1018.     AmName = GetAmigaName(ffblk.ff_name);
  1019. #else
  1020.     AmName = ffblk.ff_name;
  1021. #endif
  1022.     sprintf(Buffer," %8lu %-12.12s ",ffblk.ff_fsize, AmName);
  1023.     if(ffblk.ff_attrib & FA_HIDDEN) strcat(Buffer,"H");
  1024.     else strcat(Buffer,"-");
  1025.     if(ffblk.ff_attrib & FA_SYSTEM) strcat(Buffer,"S");
  1026.     else strcat(Buffer,"-");
  1027.     if(ffblk.ff_attrib & FA_RDONLY) strcat(Buffer,"R");
  1028.     else strcat(Buffer,"-");
  1029.     if(ffblk.ff_attrib & FA_ARCH) strcat(Buffer,"A");
  1030.     else strcat(Buffer,"-");
  1031.    }
  1032.    else sprintf(Buffer,"D         %-12.12s     ",ffblk.ff_name);
  1033.    sprintf(Temp,"  %02u/%02u/%u  %02u:%02u:%02u ",
  1034.                         day,month,year,hour,minute,sec);
  1035.    strcat(Buffer,Temp);
  1036.    len = strlen(Buffer);
  1037.    SendPacket(&len,1);
  1038.    Error = GetSynch();
  1039.    if(Error)
  1040.    {
  1041.     if(verb) printf("SendDirEntriesToAmiga(): Workstation Is Not Responding\n");
  1042.     return Error;
  1043.    }
  1044.    SendPacket(Buffer,len);
  1045.    Error = GetSynch();
  1046.    if(Error)
  1047.    {
  1048.     if(verb) printf("SendDirEntriesToAmiga(): Workstation Is Not Responding\n");
  1049.     return Error;
  1050.    }
  1051.   }
  1052.   done = findnext(&ffblk);
  1053.  }
  1054.  Buffer[0] = 0;
  1055.  SendPacket(Buffer,1);
  1056.  Error = GetSynch();
  1057.  if(Error)
  1058.  {
  1059.   if(verb) printf("SendDirEntriesToAmiga(): Workstation Is Not Responding\n");
  1060.   return Error;
  1061.  }
  1062.  SendPacket("!",1);
  1063.  return NO_ERROR;
  1064. }
  1065.  
  1066. long SetSerial(void)
  1067. {
  1068.  long Error,Rec_OK = FALSE,done = FALSE;
  1069.  unsigned char RecCount,count;
  1070.  
  1071.  do
  1072.  {
  1073.   if(verb) printf("SetSerial(): Trying Speed No. %d\n",CurrSpeed);
  1074.   Test = TRUE;
  1075.   SetSer(CurrSpeed);
  1076.   Error = GetSynch();
  1077.   if(Error) return Error;
  1078.   SendPacket("!",1);
  1079.   Test = FALSE;
  1080.   Error = ReceivePacket(Temp,SERTESTLEN);
  1081.   if(Error) RecCount = 1;
  1082.   else RecCount = SERTESTLEN;
  1083.   for(count = 0; count < SERTESTLEN; count++)
  1084.    if(Temp[count] != count) break;
  1085.   if(count == SERTESTLEN) Rec_OK = TRUE;
  1086.   else Rec_OK = FALSE;
  1087.   if((RecCount == SERTESTLEN) && (Rec_OK))
  1088.   {
  1089.    SendPacket("!",1);
  1090.    Error = GetSynch();
  1091.    if(Error) return Error;
  1092.    for(count = 0; count < SERTESTLEN; count++)
  1093.     Buffer[count] = SERTESTLEN - count - 1;
  1094.    SendPacket(Buffer,SERTESTLEN);
  1095.    Error = ReceivePacket(Temp,1);
  1096.    if(Error) return ERROR_SetSer;
  1097.    if(Temp[0] != '!') CurrSpeed--;
  1098.    else done = TRUE;
  1099.   }
  1100.   else
  1101.   {
  1102.    SendPacket("1",1);
  1103.    Error = GetSynch();
  1104.    if(Error) return Error;
  1105.    else CurrSpeed--;
  1106.   }
  1107.   ClrSer();
  1108.   SendPacket("!",1);
  1109.  }while((!done) && (CurrSpeed >= 0));
  1110.  if(CurrSpeed < 0) return ERROR_NoSpeed;
  1111.  if(verb) printf("SetSerial(): Speed Set At %d\n",CurrSpeed);
  1112.  return NO_ERROR;
  1113. }
  1114.  
  1115. int GetSpeedMethodDelay(void)
  1116. {
  1117.  unsigned char chr;
  1118.  int MinSpeed = 0,tempMethod;
  1119.  long tempCurrSpeed;
  1120.  
  1121.  Method = BIOS;
  1122.  
  1123.  SetSer(MinSpeed);
  1124.  while(RecNotReady())
  1125.  {
  1126.   if(!verb) Wheel();
  1127.   else kbhit();
  1128.  }
  1129.  chr = bioscom(SERRECEIVE,0,CurrPort);
  1130.  switch(chr)
  1131.  {
  1132.   case 'H': SendPacket("!",1); tempMethod = HARD; break;
  1133.   case 'B': SendPacket("!",1); tempMethod = BIOS; break;
  1134.   default: SendPacket("1",1); tempMethod = -1; break;
  1135.  }
  1136.  if(tempMethod < -1) return -1;
  1137.  while(RecNotReady())
  1138.  {
  1139.   if(!verb) Wheel();
  1140.   else kbhit();
  1141.  }
  1142.  chr = bioscom(SERRECEIVE,0,CurrPort);
  1143.  SendPacket("!",1);
  1144.  if(chr <= MAXHARDSPEED) tempCurrSpeed = chr;
  1145.  else return -1;
  1146.  Method = tempMethod;
  1147.  CurrSpeed = tempCurrSpeed;
  1148.  while(RecNotReady())
  1149.  {
  1150.   if(!verb) Wheel();
  1151.   else kbhit();
  1152.  }
  1153.  chr = bioscom(SERRECEIVE,0,CurrPort);
  1154.  SendPacket("!",1);
  1155.  DelayTime = chr;
  1156.  if(DelayTime < 1) return -1;
  1157.  if(DelayTime > 99) return -1;
  1158.  while(RecNotReady())
  1159.  {
  1160.   if(!verb) Wheel();
  1161.   else kbhit();
  1162.  }
  1163.  chr = bioscom(SERRECEIVE,0,CurrPort);
  1164.  SendPacket("!",1);
  1165.  CheckSumTry = chr;
  1166.  if(CheckSumTry < 0) return -1;
  1167.  if(CheckSumTry > 99) return -1;
  1168.  return 0;
  1169. }
  1170.  
  1171.  
  1172. void main(int argc, char **argv)
  1173. {
  1174.  long Error;
  1175.  unsigned char Command,NoQuit = TRUE;
  1176.  
  1177.  if((argv[1][0] == '?') ||
  1178.     ((argv[1][0] == '/') && (argv[1][1] == '?')))
  1179.  {
  1180.   printf("\nEasyTransfer V2.0 Beta. By Kamran Karimi\n\n");
  1181.   printf("Connects an Amiga and an IBM PC or compatible via a 3 wire null\n");
  1182.   printf("modem serial cable\n");
  1183.   printf("Another program should also run on the Amiga\n\n");
  1184.   printf("Options:\n");
  1185.   printf("        -v or -V   This will make the program verbose\n\n");
  1186.   printf("        -1 or -2   Use serial port 1 or 2. Default is port 2\n\n");
  1187.   exit(0);
  1188.  }
  1189.  
  1190.  while(--argc > 0)
  1191.  {
  1192.   if(argv[argc][0] == '-')
  1193.   {
  1194.    if((argv[argc][1] == 'v') || (argv[argc][1] == 'V')) verb = TRUE;
  1195.    if(argv[argc][1] == '1') CurrPort = COM1;
  1196.    if(argv[argc][1] == '2') CurrPort = COM2;
  1197.   }
  1198.  }
  1199.  harderr(Handler);
  1200.  gettextinfo(&ti);
  1201.  textmode(C80);
  1202.  clrscr();
  1203.  OpenTimer();
  1204.  setcbrk(1);
  1205.  ctrlbrk(c_break);
  1206.  _setcursortype(_NOCURSOR);
  1207.  printf("EasyTransfer V2.0 Beta (Invoke With ? Or /? For Information)\n");
  1208.  printf("By Kamran Karimi\n");
  1209.  printf("\nUsing Serial Port %d\n",CurrPort + 1);
  1210.  printf("Press Control-Break To Quit\n\n");
  1211.  printf("Press Return Key To Begin:");
  1212.  fgetchar();
  1213.  
  1214.  if(!verb) FillScreen();
  1215.  do
  1216.  {
  1217.   ClrSer();
  1218.   if(verb) printf("main(): Getting Communication Parameters...");
  1219.   if(GetSpeedMethodDelay() == -1)
  1220.   {
  1221.    if(verb) printf(" Failed\n",Method);
  1222.    continue;
  1223.   }
  1224.   if(verb) printf(" Done\n");
  1225.   ClrSer();
  1226.   Error = SetSerial();
  1227.   if(Error)
  1228.   {
  1229.    if(verb) printf("main(): Error = %d\n",Error);
  1230.   }
  1231.  }while(Error);
  1232.  
  1233.  while(NoQuit)
  1234.  {
  1235.   EstablishConnection();
  1236.   if(verb) printf("main(): Connection Established\n");
  1237.   Command = ReceiveCommand();
  1238.   if(verb) printf("main(): Command Received: ");
  1239.   switch (Command)
  1240.   {
  1241.    case ERROR: if(verb) printf("Error In Command...\n"); 
  1242.            Error = TRUE;
  1243.            break; /* error */
  1244.  
  1245.    case DIR: if(verb) printf("DIR...\n");
  1246.          Error = SendDirEntriesToAmiga();
  1247.          break;
  1248.  
  1249.    case RECEIVE: if(verb) printf("SendToAmiga...\n");
  1250.          Error = SendToAmiga(); 
  1251.          break;
  1252.  
  1253.    case SEND: if(verb) printf("ReceiveFromAmiga...\n");
  1254.           Error = ReceiveFileFromAmiga();
  1255.           break;
  1256.  
  1257.    case MKDIR: if(verb) printf("MakeDir...\n");
  1258.            Error = HandleM_R_Dir(MKDIR);
  1259.            break;
  1260.  
  1261.    case RMDIR: if(verb) printf("RemoveDir...\n");
  1262.            Error = HandleM_R_Dir(RMDIR);
  1263.            break;
  1264.  
  1265.    case DELETE: if(verb) printf("DeleteFile...\n");
  1266.         Error = DeleteServerFile();
  1267.         break;
  1268.  
  1269.    case CD: if(verb) printf("ChangeDir...\n");
  1270.         Error = ChangeServerDir();
  1271.         break;
  1272.  
  1273.    case QUIT: if(verb) printf("Quiting...\n");
  1274.           Error = HandleQuit();
  1275.           NoQuit = FALSE;
  1276.           break;
  1277.  
  1278.    default : if(verb) printf("Unknown Command...\n"); 
  1279.          Error = TRUE;    
  1280.          break;
  1281.   }
  1282.   if(Error) 
  1283.   {
  1284.    ClrSer();
  1285.    if(verb) printf("main(): Failed\n\n");    
  1286.   }
  1287.   else if(verb) printf("main(): Done\n\n");    
  1288.  }
  1289.  CloseTimer();
  1290.  textmode(ti.currmode);
  1291.  textattr(ti.attribute);
  1292.  _setcursortype(_NORMALCURSOR);
  1293.  clrscr();
  1294.  printf("EasyTransfer: Quitted\n");
  1295. }
  1296.